﻿using System;
using System.Diagnostics;
using System.Windows.Forms;
using CS2PHPCryptography;
using Newtonsoft.Json;
using System.Collections.Generic;


namespace SmartBot
{
    public partial class frmLogin : Form
    {
        SecurePHPConnection secureLogon;
        string HWID = new Helper.HWID().Value;

        /// <summary>
        /// Instance of the SmartClass. This class is to store ALL information of everything.
        /// </summary>
        public static SmartClass MainClass = new SmartClass();
        /// <summary>
        /// Instance of the login form in case we need to reference to the frmLogin from the frmMain.
        /// </summary>
        public static frmLogin frmLoginInstance;

        public static frmLog LoggingForm = new frmLog();

        public frmLogin()
        {
            InitializeComponent();

            #region Đoạn này ông H làm sai rồi, tôi đã sửa lại phía dưới, ngay event btnLogin_Click
            //Temporary for developing 
            //frmLogin.MainClass.GlobalSetting.LoginInfo["Command"] = "LOGIN_OK";
            //LoginProcess("Temp");
            #endregion

            //Used as instance of the login form.
            frmLogin.frmLoginInstance = this;

        }
        
        #region Login Helper Functions

        public void LogWriter(string log)
        {
            LoggingForm.logText.AppendText(log + "\n");
        }
        /// <summary>
        /// Sự kiện khi có thể kết nối được với Login server
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void secureLogon_OnConnectionEstablished(object sender, OnConnectionEstablishedEventArgs e)
        {
            LogWriter("Kết nối được với server");
            // Gởi HardwareID và nhận về SessionID
            MainClass.GlobalSetting.LoginInfo["Command"] = "LOGON_REQUEST";
            MainClass.GlobalSetting.LoginInfo["HardwareID"] = HWID;
            LogWriter("Gởi lệnh [LOGON_REQUEST]...");
            secureLogon.SendMessageSecureAsync(JsonConvert.SerializeObject(MainClass.GlobalSetting.LoginInfo, Formatting.None));            
        }

        /// <summary>
        /// Sự kiện khi nhận được phản hồi từ Login server
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void secureLogon_OnResponseReceived(object sender, ResponseReceivedEventArgs e)
        {
            MainClass.GlobalSetting.LoginInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(e.Response);
            //MessageBox.Show(e.Response);
            switch (MainClass.GlobalSetting.LoginInfo["Command"])
            {
                case "LOGON_RESPONSE":
                    LogonProcess(e.Response);
                    break;
                case "LOGIN_OK":
                    LoginProcess(e.Response);
                    break;

                default:
                    MessageBox.Show(MainClass.GlobalSetting.LoginInfo["Command"]);
                    btnLogin.Enabled = true;
                    break;
            }
        }

        /// <summary>
        /// Xử lý thông tin ban đầu được trả về từ Login server
        /// </summary>
        /// <param name="strResponse"></param>
        void LogonProcess(string strResponse)
        {
            LogWriter("Nhận được lệnh [LOGON_RESPONSE]");
            MainClass.GlobalSetting.LoginInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(strResponse);
            btnLogin.Enabled = true;
        }

        /// <summary>
        /// Xử lý thông tin sau khi đăng nhập được Login server gởi về
        /// </summary>
        /// <param name="strResponse"></param>
        void LoginProcess(string strResponse)
        {
            LogWriter("Đăng nhập thành công.\nMở form chính để bắt đầu auto.");
            this.Hide();

            frmMain MainForm = new frmMain();
            MainForm.Show();
        }
        #endregion

        #region UI Functions
		
        private void itemExit_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }
 
        private void lblForgetPassword_Click(object sender, System.EventArgs e)
        {
        }

        private void itemSignUp_Click(object sender, System.EventArgs e)
        {
            Process.Start("http://id.gameauto.net/signup.php");
        }

        private void itemForgetPassword_Click(object sender, System.EventArgs e)
        {
            Process.Start("http://id.gameauto.net/lostpassword.php");
        }


        private void btnLogin_Click(object sender, EventArgs e)
        {
            // Auto Click.
            // Temporary for developing
            // Ông Hảo chưa hiểu ý đồ của tui, nên gán auto login sai rồi.
            if (btnLogin.Enabled)
            {
                if (!String.IsNullOrEmpty(txtUserID.Text) && !String.IsNullOrEmpty(txtUserPassword.Text))
                {
                    LogWriter("Gởi thông tin đăng nhập: " + txtUserID.Text + "/" + txtUserPassword.Text);
                    MainClass.GlobalSetting.LoginInfo["Command"] = "LOGIN_REQUEST";
                    MainClass.GlobalSetting.LoginInfo["user_login"] = txtUserID.Text;
                    MainClass.GlobalSetting.LoginInfo["user_password"] = txtUserPassword.Text;

                    try
                    {
                        secureLogon.SendMessageSecureAsync(JsonConvert.SerializeObject(MainClass.GlobalSetting.LoginInfo, Formatting.None));
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Không thể kết nối với máy chủ. Vui lòng thử lại sau.\n" + ex.Message);
                    }
                    btnLogin.Enabled = false;
                }
                else
                {
                    Helper.Message("Tên đăng nhập và mật khẩu không được để trống");
                    btnLogin.Enabled = true;
                    txtUserID.Focus();
                }
            }
        }

        private void itemSignOut_Click(object sender, EventArgs e)
        {
            DialogResult SignOut = MessageBox.Show("Bạn chắc chắn muốn đăng xuất", "SmartBot TLBB", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            
            if (SignOut == DialogResult.Yes)
            {
                lblStatus.Text = "Đăng xuất thành công";
                // Gởi thông tin đăng xuất
            }
        }

        /// <summary>
        /// After loaded the form, initialize connection
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmLogin_Load(object sender, EventArgs e)
        {
            LoggingForm.Show();

            this.Text = "GÀ TLBB (phiên bản " + Application.ProductVersion + ")";
                secureLogon = new SecurePHPConnection();
                secureLogon.OnConnectionEstablished += new SecurePHPConnection.ConnectionEstablishedHandler(secureLogon_OnConnectionEstablished);
                secureLogon.OnResponseReceived += new SecurePHPConnection.ResponseReceivedHandler(secureLogon_OnResponseReceived);

                secureLogon.SetRemotePhpScriptLocation("http://auth.gameauto.net");
                LogWriter("Chờ tín hiệu từ server...");
                secureLogon.EstablishSecureConnectionAsync();
            //try
            //{
                
            //}
            //catch (Exception ex)
            //{
            //    this.Text = "Error connecting to SmartBot server. Try again later.\n" + ex.Message;
            //}
        }

        #endregion

    }
}
